package com.yugao.fintech.antelope.infra.common;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

/**
 * 二维码场景
 * 当用户扫码之后, 会在 infra 服务中收到微信服务器的推送扫码事件, 然后由infra服务将数据推送到业务服务中进行处理 <br/>
 * 比如如下两种场景 <br/>
 * 1. 收到获取用户openId扫码场景事件, 就调用push服务, 然后由push服务, 最终通过 websocket 返回给前端
 * 2. 收到用户登录的扫码场景事件, 调用auth服务进行登录处理, 然后auth处理完, 再最终通过 websocket 返回给前端(经过push服务)

 */
@Getter
@AllArgsConstructor
public enum QrCodeSceneEnum {
    DEFAULT("default", ofKeys()),
    /** 扫码登录 */
    SCAN_LOGIN("scanLogin", ofKeys(ScanScene.QR_CODE_ID)),

    /** 用户扫码后, 获取用户的openId */
    GET_OPENID("getOpenId", ofKeys(ScanScene.USER_ID, ScanScene.LOGIN_ID)),
    ;

    private final String code;

    /**
     * 参数字段key
     */
    private final List<String> paramKeys;

    public static QrCodeSceneEnum of(String code) {
       return Arrays.stream(values()).filter(e -> e.getCode().equals(code)).findFirst().orElse(QrCodeSceneEnum.DEFAULT);
    }

    /**
     * 创建参数key
     */
    private static List<String> ofKeys(String... keys) {
        List<String> list = new LinkedList<>();
        list.add(ScanScene.SCENE_CODE);
        list.addAll(Arrays.asList(keys));
        return list;
    }
}
